/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ngc;

import edu.ucue.ptc.gco.dao.CategoriaDAOLocal;
import edu.ucue.ptc.gco.mdl.Categoria;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import edu.ucue.ptc.gco.util.ElementoYaExisteException;
import edu.ucue.ptc.gco.util.ValidarAtributoUtil;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.inject.Inject;
import javax.inject.Named;

/**
 * @author edwin
 */
@Stateful
@Named(value = "categoriaManager")
public class CategoriaManager implements CategoriaManagerLocal {

    @Inject
    private CategoriaDAOLocal categoriaDao;
    @EJB
    private UsuarioManagerLocal ejbRefUsuario;

    @Override
    public void crear(Categoria categoria, String usuario, String password) throws AtributoInvalidoException, ElementoYaExisteException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("categoria", categoria);

        ValidarAtributoUtil.validarStringNuloVacio("nombreCategoria", categoria.getNombre());

        Categoria c = categoriaDao.obtenerPorId(categoria.getIdCategoria());
        if (c != null) {
            throw new ElementoYaExisteException("Categoria con id " + c.getIdCategoria() + " ya existe.");
        }
        categoriaDao.crear(categoria);
    }

    @Override
    public Categoria crearT(Categoria categoria, String usuario, String password) throws AtributoInvalidoException, ElementoYaExisteException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("categoria", categoria);

        ValidarAtributoUtil.validarStringNuloVacio("nombreCategoria", categoria.getNombre());

        Categoria c = categoriaDao.obtenerPorId(categoria.getIdCategoria());
        if (c != null) {
            throw new ElementoYaExisteException("Categoria con id " + c.getIdCategoria() + " ya existe.");
        }
        categoriaDao.crear(categoria);
        
        return categoria;
    }
    
    @Override
    public void actualizar(Categoria categoria, String usuario, String password) throws AtributoInvalidoException, ElementoYaExisteException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("categoria", categoria);

        ValidarAtributoUtil.validarStringNuloVacio("nombreCategoria", categoria.getNombre());

        Categoria c = categoriaDao.obtenerPorId(categoria.getIdCategoria());
        if (c == null) {
            throw new ElementoYaExisteException("Categoria con id " + categoria.getIdCategoria() + " debe existir.");
        }
    }
    
    @Override
    public Categoria actualizarT(Categoria categoria, String usuario, String password) throws AtributoInvalidoException, ElementoYaExisteException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("categoria", categoria);

        ValidarAtributoUtil.validarStringNuloVacio("nombreCategoria", categoria.getNombre());

        Categoria c = categoriaDao.obtenerPorId(categoria.getIdCategoria());
        if (c == null) {
            throw new ElementoYaExisteException("Categoria con id " + categoria.getIdCategoria() + " debe existir.");
        }
        
        return categoria;
    }

    @Override
    public void eliminar(Categoria categoria, String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        Categoria c = categoriaDao.obtenerPorId(categoria.getIdCategoria());
        if (c == null) {
            throw new AtributoInvalidoException("categoria", categoria.getIdCategoria(), "Categoria con id " + categoria.getIdCategoria() + " debe existir.");
        }
        categoriaDao.eliminar(categoria);
    }

    @Override
    public Categoria eliminarT(Categoria categoria, String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        Categoria c = categoriaDao.obtenerPorId(categoria.getIdCategoria());
        if (c == null) {
            throw new AtributoInvalidoException("categoria", categoria.getIdCategoria(), "Categoria con id " + categoria.getIdCategoria() + " debe existir.");
        }
        categoriaDao.eliminar(categoria);
        
        return categoria;
    }
    
    @Override
    public List<Categoria> listarTodos(String usuario, String password) throws AtributoInvalidoException, ElementoYaExisteException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        try {
            return categoriaDao.listarTodos();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    @Override
    public Categoria obtenerPorId(int idCategoria, String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        try {
            return categoriaDao.obtenerPorId(idCategoria);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }
}
